#include<stdio.h>
#include<stdlib.h>

#define uint32 unsigned int
#define uint8  unsigned char

void ShortDivOutputBin(uint32 input);
int main(int argc,char const*argv[]){
    //按位&：如果（x）i==1并且（y）i==1，那么（x&y）=1，否则（x&y）=0
    //应用：1.让某一位或某些位为0：x&0xFE
    //      2.取一个数中的某一段
    /*按位|：如果（x）i==1或者（y）i==1，那么（x|y）i=1
      应用：1.使得一位或几位为1：x|0x01
            2.把两个数拼起来：0x00FF|0xFF00*/
    /*按位~：对每一位比特取反，和取补码不一样
            ~是1变0，0变1；取补码是用10000 0000-原数*/
    /*按位^：如果（x）i==（y）i，那么（x^y）i=0，否则（x^y）==1
    对同一个变量^两次，等于什么也没做：x^y^y=x*/
    int input;
    scanf("%d",&input);
     ShortDivOutputBin(input);
    char string[33]={0};
    itoa(input,string,2);
    printf("%s\n",string);
     ShortDivOutputBin(input&0xFE);//使最后一位为0
     ShortDivOutputBin(input&0x0F);//取input中最后一段
     ShortDivOutputBin(input&0x01);//取input中最后一位
     ShortDivOutputBin(input|0x03);//使input最后两位为1
     ShortDivOutputBin(0x00FF|0xFF00);//将00FF和FF00拼起来
     ShortDivOutputBin(~input);//对input取反
     ShortDivOutputBin(-input);//对input取补码
     printf("%hhd\n",~input);//%hd,hx,hu,16位，%d，lx，ld，lu，32位，%llu，llx，lld，64位
     printf("%hhd\n",-input);//%hhd,hhx,hhu,hho输出8位十进制，十六进制 ，无符号十进制，八进制

     //逻辑运算和按位运算不一样：逻辑运算只有两个值0和1；
     //比如：5&4 =4，而5&&4 =1&1 =1
     //      5|4 =5，而5||4 =1|1 =1
     //      ~4 =3而！4 =！1 =0
    return 0;
}
void ShortDivOutputBin(uint32 input){
    uint8 temp[33] = {0};
    int i = 0;
    printf("短除法得到的二进制为：");
    while(input){
        temp[i] = input%2;
        input = (uint32)input/2;
        i++;    
    }
    for(i--;i>=0;i--){
        printf("%d",temp[i]);
    }
    printf("\r\n");
}